package servidor.bancoServidor;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.mail.MessagingException;

import servidor.controle.ContaControlador;
import servidor.controle.ExtratoControlador;
import servidor.modelo.Cliente;
import servidor.modelo.Conta;
import servidor.modelo.Extrato;
import servidor.modelo.TipoConta;

public class BancoComunicacaoPorEmail extends Thread {

	private String ultimaData = "12/12/2009";

	public void run() {
		Thread.currentThread().setPriority(MIN_PRIORITY);
		while (true) {
			String data = Log.DateNow();
			data = pegaData(data);
			try {
				ConfereSeEDiaDeMandarExtratosECobranca(data);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (MessagingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	private void ConfereSeEDiaDeMandarExtratosECobranca(String data)
			throws SQLException, MessagingException, IOException {
		if (data.charAt(0) == '0' && data.charAt(1) == '5') {
			String data1 = "" + data.charAt(3) + data.charAt(4);
			String data2 = "" + ultimaData.charAt(3) + ultimaData.charAt(4);

			if (MesesDiferentes(data1, data2)) {
				CobraTaxas();
				System.out.println("taxas cobradas");
				MandaExtratos(data);
				System.out.println("emails mandados");
				AtualizaUltimaData(data);
			}
		}
	}

	private void CobraTaxas() throws SQLException {
		ArrayList<Conta> contas = ContaControlador.getAll();
		for (int i = 0; i < contas.size(); i++) {
			if (contas.get(i).getTipoDeConta() == TipoConta.CORRENTE) {
				ContaControlador.DescontaTaxaCorrente(contas.get(i));
			} else {
				ContaControlador.JurosPoupanca(contas.get(i));
			}
		}
	}

	private void AtualizaUltimaData(String data) {
		ultimaData = data;
	}

	private void MandaExtratos(String dataAtual) {
		MandaEmail mandaEmail = new MandaEmail();
		ArrayList<Conta> contas = null;
		try {
			contas = ContaControlador.getAll();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		for (int i = 0; i < contas.size(); i++) {
			Cliente cliente = contas.get(i).getCliente();
			String[] emails = new String[1];
			emails[0] = cliente.getEmail();
			Conta conta = contas.get(i);
			ArrayList<Extrato> extratos = ExtratoControlador
					.getExtratoDaConta(conta);
			for (int j = 0; j < extratos.size(); j++) {
				String ultimaData = extratos.get(j).getData();
				int dia = Integer.parseInt("" + ultimaData.charAt(0)
						+ ultimaData.charAt(1));
				int mes = Integer.parseInt("" + ultimaData.charAt(3)
						+ ultimaData.charAt(4));
				int ano = Integer.parseInt("" + ultimaData.charAt(6)
						+ ultimaData.charAt(7) + ultimaData.charAt(8)
						+ ultimaData.charAt(9));
				mes--;
				if (mes == 0) {
					mes = 12;
					ano--;
				}

				if (!DataCorreta(dataAtual, dia, mes, ano)) {
					extratos.remove(j);
				}
			}
			try {
				mandaEmail.sendSSLMessageHtmlExtratos(emails,
						"Banco Carioca - Extratos", extratos);
			} catch (MessagingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("email de " + cliente.getNome() + " mandado\n");
		}
	}

	private boolean DataCorreta(String dataAtual, int mes, int dia, int ano) {
		int diaAtual = Integer.parseInt("" + dataAtual.charAt(0)
				+ dataAtual.charAt(1));
		int mesAtual = Integer.parseInt("" + dataAtual.charAt(3)
				+ dataAtual.charAt(4));
		int anoAtual = Integer.parseInt("" + dataAtual.charAt(6)
				+ dataAtual.charAt(7) + dataAtual.charAt(8)
				+ dataAtual.charAt(9));

		if (dia > diaAtual) {
			if (mes == --mesAtual) {
				return true;
			} else {
				if (mes == 12 && ano == --anoAtual) {
					return true;
				}
			}
		} else {
			if (mes == mesAtual && ano == anoAtual) {
				return true;
			}
		}
		return false;
	}

	private boolean MesesDiferentes(String data1, String data2) {
		if (data1.equals(data2)) {
			return false;
		}
		return true;
	}

	private String pegaData(String data) {
		String[] partes = new String[2];
		partes = data.split(" ");
		return partes[0];
	}
}